package com.xxx.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

/**
 * 正则检验工具类
 * 
 * 
 * 
 */
public class RegexUtil {

    private RegexUtil() {

    }

    /**
     * 验证手机号
     * 
     * @param str 待验证手机号
     * @return 验证通过返回true
     */
    public static boolean isMobile(String str) {
        return isMatch("^[1][3,4,5,6,7,8,9][0-9]{9}$", str);// 验证手机号
    }

    /**
     * 验证邮箱
     * 
     * @param email 待验证邮箱
     * @return 验证通过返回true
     */
    public static boolean isEmail(String email) {
        return isMatch("^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$", email);
    }

    /**
     * 判断是否是数字或小数类型
     * 
     * @param orginal
     * @return boolean
     */
    public static boolean isNumber(String orginal) {
        return isMatch("^(-?\\d+)(\\.\\d+)?$", orginal);
    }

    /**
     * 判断是否是浮点数，若是则返回整数，若不是则返回为空
     * 
     * @param orginal
     * @return boolean
     */
    public static Integer double2Int(String orginal) {
        if (isNumber(orginal)) {
            return (int) Math.floor(Double.parseDouble(orginal));
        }
        return null;
    }
    
    /**
	 * 校验字符串是否为数字类型
	 * @param checkStr
	 * @param len
	 * @return
	 */
	public static boolean validateNumber(String checkStr, int len){
		if(StringUtils.isBlank(checkStr) || len <= 0){
			return false;
		}
		String regex = "^[0-9]{"+ len +"}$";
        return isMatch(regex, checkStr);
	}

    /**
     * 校验字符串固定长度是否为字母和数字类型
     * @param checkStr
     * @param len
     * @return
     */
    public static boolean validateABCandNum(String checkStr, int len){
        if(StringUtils.isBlank(checkStr) || len <= 0){
            return false;
        }
        String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{"+ len +"}$";
        return isMatch(regex, checkStr);
    }

	/**
	 * 校验字符串是否为字母或数字类型
	 * @param checkStr
	 * @param len
	 * @return
	 */
	public static boolean validateABCorNum(String checkStr, int len){
		if(StringUtils.isBlank(checkStr) || len <= 0){
			return false;
		}
		String regex = "^[a-zA-Z0-9]{1,"+ len +"}$";
        return isMatch(regex, checkStr);
	}
	
	/**
	 * 校验字符串是否为全是数字类型
	 * @param checkStr
	 * @return
	 */
	public static boolean isAllNumber(String checkStr){
		String regex = "^[0-9]+$";
        return isMatch(regex, checkStr);
	}
	
	/**
	 * 校验是否为正整数
	 * @return
	 */
	public static boolean isPureDigital(String string) {
	    if (StringUtils.isEmpty(string)) {
	    	return false;
	    }
	    String regEx1 = "\\d+";
	    Pattern p;
	    Matcher m;
	    p = Pattern.compile(regEx1);
	    m = p.matcher(string);
	    if (m.matches() && Integer.parseInt(string) > 0) {
	    	return true;
	    } else {
	    	return false;
	    }
	}
	
	/**
	 * 判断日期格式是否合法
	 * @param str
	 * @return
	 */
	public static boolean isDate(String str) {
		DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        try{  
            formatter.parse(str);  
            return true;
        }catch(Exception e){
        	return false;
        }
	}

    private static boolean isMatch(String regex, String orginal) {
        if (StringUtils.isBlank(orginal)) {
            return false;
        }
        return Pattern.matches(regex, orginal);
    }
    
    public static void main(String[] args) {
    	System.out.println(validateABCandNum(MD5Util.MD5_32("gwq123456"), 32));
    	System.out.println(isNumber("123.0012"));
    	System.out.println(isPureDigital("123"));
    	System.out.println(isMobile("16675558798"));
	}
}
